Fix #344543
authorMatthias Clasen <matthiasc@src.gnome.org>
Mon, 12 Jun 2006 01:54:54 +0000 (01:54 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 12 Jun 2006 01:54:54 +0000 (01:54 +0000)
ChangeLog
ChangeLog.pre-2-10
gtk/gtkprogress.c
gtk/gtkprogressbar.c
gtk/gtkprogressbar.h

index c5aefd3374b283d57caa22eab6ecefaebc507fbd..c49d33b8bf0ddff609e3f9620f4db1ac0f6ce70a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-06-11  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtkprogressbar.h: Add a dirty flag to GtkProgressBar.n/ 
+       * gtk/gtkprogressbar.c: Defer updating of the offscreen
+       pixmap until expose.  (#344543, Chris Wilson)
+
 2006-06-11  Emmanuele Bassi  <ebassi@gnome.org>
 
        * gtk/gtkrecentchooserdefault.c
index c5aefd3374b283d57caa22eab6ecefaebc507fbd..c49d33b8bf0ddff609e3f9620f4db1ac0f6ce70a 100644 (file)
@@ -1,3 +1,9 @@
+2006-06-11  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtkprogressbar.h: Add a dirty flag to GtkProgressBar.n/ 
+       * gtk/gtkprogressbar.c: Defer updating of the offscreen
+       pixmap until expose.  (#344543, Chris Wilson)
+
 2006-06-11  Emmanuele Bassi  <ebassi@gnome.org>
 
        * gtk/gtkrecentchooserdefault.c
index 969ab7f802510f26174d93d90a27c338f928818e..ba403a6550eca7a070efe4ebf43eab8bfca3c93d 100644 (file)
@@ -56,7 +56,7 @@ static void gtk_progress_get_property    (GObject          *object,
 static void gtk_progress_destroy         (GtkObject        *object);
 static void gtk_progress_finalize        (GObject          *object);
 static void gtk_progress_realize         (GtkWidget        *widget);
-static gint gtk_progress_expose          (GtkWidget        *widget,
+static gboolean gtk_progress_expose      (GtkWidget        *widget,
                                          GdkEventExpose   *event);
 static void gtk_progress_size_allocate   (GtkWidget        *widget,
                                          GtkAllocation    *allocation);
@@ -283,7 +283,7 @@ gtk_progress_finalize (GObject *object)
   G_OBJECT_CLASS (gtk_progress_parent_class)->finalize (object);
 }
 
-static gint
+static gboolean
 gtk_progress_expose (GtkWidget      *widget,
                     GdkEventExpose *event)
 {
index 0bf8661f286cb6378d2e38bb39536e7d4512b11f..a37ad3b4d1a7ad56f22a4a96441128760b1fff74 100644 (file)
@@ -73,6 +73,8 @@ static void gtk_progress_bar_get_property  (GObject             *object,
                                            guint                prop_id,
                                            GValue              *value,
                                            GParamSpec          *pspec);
+static gboolean gtk_progress_bar_expose    (GtkWidget           *widget,
+                                           GdkEventExpose      *event);
 static void gtk_progress_bar_size_request  (GtkWidget           *widget,
                                            GtkRequisition      *requisition);
 static void gtk_progress_bar_real_update   (GtkProgress         *progress);
@@ -105,6 +107,7 @@ gtk_progress_bar_class_init (GtkProgressBarClass *class)
   gobject_class->set_property = gtk_progress_bar_set_property;
   gobject_class->get_property = gtk_progress_bar_get_property;
   
+  widget_class->expose_event = gtk_progress_bar_expose;
   widget_class->size_request = gtk_progress_bar_size_request;
 
   progress_class->paint = gtk_progress_bar_paint;
@@ -438,7 +441,7 @@ gtk_progress_bar_real_update (GtkProgress *progress)
                }
            }
        }
-      gtk_progress_bar_paint (progress);
+      pbar->dirty = TRUE;
       gtk_widget_queue_draw (GTK_WIDGET (progress));
     }
   else
@@ -451,12 +454,28 @@ gtk_progress_bar_real_update (GtkProgress *progress)
       if (pbar->in_block != in_block)
        {
          pbar->in_block = in_block;
-         gtk_progress_bar_paint (progress);
+         pbar->dirty = TRUE;
          gtk_widget_queue_draw (GTK_WIDGET (progress));
        }
     }
 }
 
+static gboolean
+gtk_progress_bar_expose (GtkWidget      *widget,
+                    GdkEventExpose *event)
+{
+  GtkProgressBar *pbar;
+
+  g_return_val_if_fail (GTK_IS_PROGRESS_BAR (widget), FALSE);
+
+  pbar = GTK_PROGRESS_BAR (widget);
+
+  if (GTK_WIDGET_DRAWABLE (widget) && pbar->dirty)
+    gtk_progress_bar_paint (GTK_PROGRESS (pbar));
+
+  return GTK_WIDGET_CLASS (gtk_progress_bar_parent_class)->expose_event (widget, event);
+}
+
 static void
 gtk_progress_bar_size_request (GtkWidget      *widget,
                               GtkRequisition *requisition)
@@ -870,6 +889,8 @@ gtk_progress_bar_paint (GtkProgress *progress)
          else
            gtk_progress_bar_paint_discrete (pbar, orientation);
        }
+
+      pbar->dirty = FALSE;
     }
 }
 
index 2eb3360c18801f7d5efcdffcb4130f672c552aee..1e556164768a737d0828f90c285b3d064997b310 100644 (file)
@@ -77,6 +77,7 @@ struct _GtkProgressBar
   
   guint activity_dir : 1;
   guint ellipsize : 3;
+  guint dirty : 1;
 };
 
 struct _GtkProgressBarClass